/**
 * 在根元素上设置颜色。
 * 
 * @param color - 颜色值，支持 16 进制或 RGB 格式。
 * @param colorName - CSS 变量名称，默认为 `color`。
 * @param generateAlpha - 是否生成带有随机透明度的额外颜色，默认为 `false`。
 * @returns {boolean} - 设置成功返回 `true`，失败返回 `false`。
 */
function setRootColor(color: string, colorName: string = 'color', generateAlpha: boolean = false): boolean {
    const hexReg = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/;
    const rgbReg = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;

    if (!hexReg.test(color) && !rgbReg.test(color)) {
        console.error('颜色格式错误，支持 16 进制 (#RRGGBB 或 #RGB) 和 RGB (rgb(R, G, B))');
        return false;
    }

    const root = document.documentElement || document.body;
    root.style.setProperty(`--${colorName}`, color);

    if (!generateAlpha) {
        return true;
    }

    // 生成带有随机透明度的额外颜色
    let colorStr = color.toLowerCase().replace(/#/g, "");
    const length = colorStr.length;
    let rgb: number[] = [];

    if (length === 3) {
        // 如果是短格式 16 进制，扩展为长格式
        colorStr = colorStr.split('').map(c => c + c).join('');
    }

    if (length === 6) {
        // 解析 16 进制颜色
        for (let i = 0; i < 6; i += 2) {
            rgb.push(parseInt(colorStr.substring(i, i + 2), 16));
        }
    } else if (rgbReg.test(color)) {
        // 解析 RGB 颜色
        const matches = color.match(rgbReg);
        rgb = matches ? [parseInt(matches[1]), parseInt(matches[2]), parseInt(matches[3])] : [255, 255, 255];
    }

    for (let i = 1; i < 10; i++) {
        const alpha = `0.${i}`;
        const rgba = `rgba(${rgb.join(",")},${alpha})`;
        root.style.setProperty(`--${colorName}0${i}`, rgba);
    }

    return true;
}

export default setRootColor;